+2005-05-02 Federico Mena Quintero <federico@ximian.com>
+
+ Merged from gtk-2-6:
+
+ Fixes #301068:
+
+ * gtk/gtkfilesystemunix.c (struct _GtkFileSystemUnix): Add fields
+ to store struct stat for /afs and /net, and boolean fields to say
+ whether these are valid.
+ (struct _GtkFileFolderUnix): Added a boolean is_network_dir field.
+ (gtk_file_system_unix_get_folder): Fill in the is_network_dir
+ field of the folder structure.
+ (fill_in_names): If the folder is a network directory, create a
+ fake struct stat for its entries.
+ (fill_in_stats): Don't stat() the children of network directories.
+
+ * gtk/gtkfilechooserdefault.c (list_mtime_data_func): If the mtime
+ is 0, use "Unknown" for the cell's displayed text.
+
2005-04-28 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwidget.c: Add a draw-border style property to allow
+2005-05-02 Federico Mena Quintero <federico@ximian.com>
+
+ Merged from gtk-2-6:
+
+ Fixes #301068:
+
+ * gtk/gtkfilesystemunix.c (struct _GtkFileSystemUnix): Add fields
+ to store struct stat for /afs and /net, and boolean fields to say
+ whether these are valid.
+ (struct _GtkFileFolderUnix): Added a boolean is_network_dir field.
+ (gtk_file_system_unix_get_folder): Fill in the is_network_dir
+ field of the folder structure.
+ (fill_in_names): If the folder is a network directory, create a
+ fake struct stat for its entries.
+ (fill_in_stats): Don't stat() the children of network directories.
+
+ * gtk/gtkfilechooserdefault.c (list_mtime_data_func): If the mtime
+ is 0, use "Unknown" for the cell's displayed text.
+
2005-04-28 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwidget.c: Add a draw-border style property to allow
+2005-05-02 Federico Mena Quintero <federico@ximian.com>
+
+ Merged from gtk-2-6:
+
+ Fixes #301068:
+
+ * gtk/gtkfilesystemunix.c (struct _GtkFileSystemUnix): Add fields
+ to store struct stat for /afs and /net, and boolean fields to say
+ whether these are valid.
+ (struct _GtkFileFolderUnix): Added a boolean is_network_dir field.
+ (gtk_file_system_unix_get_folder): Fill in the is_network_dir
+ field of the folder structure.
+ (fill_in_names): If the folder is a network directory, create a
+ fake struct stat for its entries.
+ (fill_in_stats): Don't stat() the children of network directories.
+
+ * gtk/gtkfilechooserdefault.c (list_mtime_data_func): If the mtime
+ is 0, use "Unknown" for the cell's displayed text.
+
2005-04-28 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwidget.c: Add a draw-border style property to allow
}
time_mtime = gtk_file_info_get_modification_time (info);
- g_date_set_time (&mtime, (GTime) time_mtime);
- time_now = (GTime ) time (NULL);
- g_date_set_time (&now, (GTime) time_now);
-
- days_diff = g_date_get_julian (&now) - g_date_get_julian (&mtime);
-
- if (days_diff == 0)
- strcpy (buf, _("Today"));
- else if (days_diff == 1)
- strcpy (buf, _("Yesterday"));
+ if (time_mtime == 0)
+ strcpy (buf, _("Unknown"));
else
{
- char *format;
+ g_date_set_time (&mtime, (GTime) time_mtime);
+
+ time_now = (GTime ) time (NULL);
+ g_date_set_time (&now, (GTime) time_now);
+
+ days_diff = g_date_get_julian (&now) - g_date_get_julian (&mtime);
- if (days_diff > 1 && days_diff < 7)
- format = "%A"; /* Days from last week */
+ if (days_diff == 0)
+ strcpy (buf, _("Today"));
+ else if (days_diff == 1)
+ strcpy (buf, _("Yesterday"));
else
- format = "%x"; /* Any other date */
+ {
+ char *format;
+
+ if (days_diff > 1 && days_diff < 7)
+ format = "%A"; /* Days from last week */
+ else
+ format = "%x"; /* Any other date */
- if (g_date_strftime (buf, sizeof (buf), format, &mtime) == 0)
- strcpy (buf, _("Unknown"));
+ if (g_date_strftime (buf, sizeof (buf), format, &mtime) == 0)
+ strcpy (buf, _("Unknown"));
+ }
}
if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
GObject parent_instance;
GHashTable *folder_hash;
+
+ /* For /afs and /net */
+ struct stat afs_statbuf;
+ struct stat net_statbuf;
+
+ guint have_afs : 1;
+ guint have_net : 1;
};
/* Icon type, supplemented by MIME type
GtkFileInfoType types;
gchar *filename;
GHashTable *stat_info;
- unsigned int have_stat : 1;
- unsigned int have_mime_type : 1;
+ guint have_stat : 1;
+ guint have_mime_type : 1;
+ guint is_network_dir : 1;
time_t asof;
};
gtk_file_system_unix_init (GtkFileSystemUnix *system_unix)
{
system_unix->folder_hash = g_hash_table_new (g_str_hash, g_str_equal);
+
+ if (stat ("/afs", &system_unix->afs_statbuf) == 0)
+ system_unix->have_afs = TRUE;
+ else
+ system_unix->have_afs = FALSE;
+
+ if (stat ("/net", &system_unix->net_statbuf) == 0)
+ system_unix->have_net = TRUE;
+ else
+ system_unix->have_net = FALSE;
}
static void
int code;
int my_errno;
+ code = my_errno = 0; /* shut up GCC */
+
result = stat (filename, &statbuf);
if (result == 0)
folder_unix->have_mime_type = FALSE;
folder_unix->have_stat = FALSE;
+ if ((system_unix->have_afs &&
+ system_unix->afs_statbuf.st_dev == statbuf.st_dev &&
+ system_unix->afs_statbuf.st_ino == statbuf.st_ino) ||
+ (system_unix->have_net &&
+ system_unix->net_statbuf.st_dev == statbuf.st_dev &&
+ system_unix->net_statbuf.st_ino == statbuf.st_ino))
+ folder_unix->is_network_dir = TRUE;
+ else
+ folder_unix->is_network_dir = FALSE;
+
g_hash_table_insert (system_unix->folder_hash,
folder_unix->filename,
folder_unix);
while (TRUE)
{
- const gchar *basename = g_dir_read_name (dir);
+ struct stat_info_entry *entry;
+ const gchar *basename;
+
+ basename = g_dir_read_name (dir);
if (!basename)
break;
+ entry = g_new0 (struct stat_info_entry, 1);
+ if (folder_unix->is_network_dir)
+ entry->statbuf.st_mode = S_IFDIR;
+
g_hash_table_insert (folder_unix->stat_info,
g_strdup (basename),
- g_new0 (struct stat_info_entry, 1));
+ entry);
}
g_dir_close (dir);
if (!fill_in_names (folder_unix, NULL))
return;
- g_hash_table_foreach_remove (folder_unix->stat_info,
- cb_fill_in_stats,
- folder_unix);
+ if (!folder_unix->is_network_dir)
+ g_hash_table_foreach_remove (folder_unix->stat_info,
+ cb_fill_in_stats,
+ folder_unix);
folder_unix->have_stat = TRUE;
}